#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll w, n, ans;
struct NODE
{
	ll num1, num2; // 初始情况下，比如12就是12个1，{1，12}
	bool operator>(const NODE &a) const { return num1 > a.num1; }
} tmp, tmp2;
priority_queue<NODE, vector<NODE>, greater<NODE>> q; // 重载大于号，因为前面定义了小根堆

// 数值太大，使用优先队列很难实现，因此使用贪心算法

int main()
{
	cin >> w;
	while (w--)
	{
		ans = 0;
		cin >> n;
		while (!q.empty()) // 首先，清空小根堆
		{
			q.pop();
		}
		q.push({1, n});								  // 然后将初始的情况放到堆里面
		while (!(q.size() == 1 && q.top().num2 == 1)) // 终止条件：堆中只有一个元素，且该元素为1
		{
			tmp = q.top();
			q.pop();
			// 堆头数量是否等于1分为两种情况
			if (tmp.num2 == 1) // 取出来之后和新的堆头的元素进行合并
			{
				tmp2 = q.top();
				q.pop();
				// 将tmp1和tmp2进行合并，合并的时候会产生一个代价数（也就是差值）
				ans += tmp2.num1 - tmp.num1;
				q.push({tmp2.num1 + tmp2.num2, 1});
				if (tmp2.num2 != 1) // 如果堆头的元素个数不是1，那它本身数量也要更新，也就是减一
				{
					q.push({tmp2.num1, tmp2.num2 - 1});
				}
			}

			else
			{ // 大于1就根据自身情况处理,分为奇数和偶数
				if (tmp.num2 % 2)
				{
					q.push({tmp.num1 * 2, tmp.num2 / 2});
					q.push({tmp.num1, 1});
				}
				else
				{
					q.push({tmp.num1 * 2, tmp.num2 / 2});
				}
			}
			cout << ans << endl;
		}
	}

	return 0;
}